﻿using K3Cloud.WebApi.Core.IoC.DataEntity;
using K3Cloud.WebApi.Core.IoC.K3Client;
using System.Net;

namespace K3Cloud.WebApi.Core.IoC;
/// <summary>
/// 金蝶云星空SDK
/// </summary>
public class K3Scoped
{
    private K3Scoped() { }

    /// <summary>
    /// 获取当前上下文的 API 客户端（默认客户端）。
    /// 若当前上下文未初始化，则自动创建并缓存。
    /// 用于所有金蝶云星空 WebApi 的主入口。
    /// </summary>
    public static K3CloudApiClient Client => GetK3CloudClient();

    /// <summary>
    /// 获取当前全局 CookieContainer。
    /// 用于管理 WebApi 请求的 Cookie（如登录态、会话等）。
    /// </summary>
    public static CookieContainer Cookie => K3IOCServiceCollectionExtensions._cookie;

    /// <summary>
    /// 获取当前登录结果信息。
    /// 包含登录用户、令牌、会话等信息。
    /// </summary>
    public static LoginResult? LoginResult => K3IOCServiceCollectionExtensions.LoginResult;

    /// <summary>
    /// 获取底层 HTTP 客户端服务。
    /// 用于底层 HTTP 请求的发送与响应处理。
    /// </summary>
    public static K3HttpService HttpClient => K3IOCServiceCollectionExtensions.HttpClient;

    /// <summary>
    /// 获取指定配置键（appsettings.json中配置）的 API 客户端。
    /// 用于多账套、多环境等场景。
    /// </summary>
    /// <param name="configKey">配置文件中的客户端Key</param>
    /// <returns>对应配置的K3CloudApiClient实例</returns>
    public static K3CloudApiClient GetClient(string configKey) => GetK3CloudClient(configKey);

    /// <summary>
    /// 获取当前上下文的 API 客户端，若未初始化则自动创建。
    /// 内部方法，支持指定配置Key。
    /// </summary>
    /// <param name="configKey">配置文件中的客户端Key，可选</param>
    /// <returns>K3CloudApiClient实例</returns>
    private static K3CloudApiClient GetK3CloudClient(string? configKey = default)
    {
        // 优先从当前上下文获取客户端实例，若无则新建并缓存
        K3CloudApiClient? sugar = IocCallContext<K3CloudApiClient>.GetData(IocConst.CLIENT_KEY);
        if (sugar == null)
        {
            K3CloudApiClient result = K3CloudHelper.GetNewK3cloudClient(configKey);
            IocCallContext<K3CloudApiClient>.SetData(IocConst.CLIENT_KEY, result);
            return result;
        }
        return sugar;
    }
}
